package bitOperation;

/**
@author city
@date 2:09 AM 2020/6/26
 
############################################# 题目描述 #############################################

260. 只出现一次的数字 III
给定一个整数数组 nums，其中恰好有两个元素只出现一次，其余所有元素均出现两次。 找出只出现一次的那两个元素。

示例 :

输入: [1,2,1,3,2,5]
输出: [3,5]
注意：

结果输出的顺序并不重要，对于上面的例子， [5, 3] 也是正确答案。
你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现？

############################################# 题目描述 #############################################
 */
public class L260SingleNumber3 {
    
    public int[] singleNumber(int[] nums) {
        int diff = 0;
        for(int num : nums){
            diff ^= num;
        }

        // x & -x 会保留x二进制中最后一个1，其他的位变成0
        // 拓展 x & x -1 会使x中最后一个1，变成 0
        
        int lastDiff = diff & -diff;

        int ansA = 0;
        for(int num : nums){
            // 所有lastDiff那一位，为1的数字，异或，可以异或出来 不同两个数中的一个。细品
            if((num & diff) != 0){
                ansA ^= num;
            }
        }

        return new int [] {ansA, ansA ^ diff};
    }
}
